﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AOYOU.Framework.Utility;

namespace AOYOU.Framework.Config.Core
{
    public abstract class ConfigUnit : MarshalByRefObject
    {
        /// <summary>
        /// 配置最后一次加载的时间；
        /// </summary>
        [System.Xml.Serialization.XmlIgnore]
        [ConfigAccess(ConfigAccessAttribute.ALL)]
        public DateTime LastLoadTime { get; set; }

        /// <summary>
        /// 需要每个子类确定各自对应配置文件位置及名称
        /// </summary>
        [System.Xml.Serialization.XmlIgnore]
        public virtual string FilePath
        {
            get
            {
                return this.GetType().Name + ".config";
            }
        }
        
        /// <summary>
        /// 1.加载配置（反序列化本地文件）
        /// 2.在监控到文件有变化时，也会被调用。
        /// </summary>
        /// <param name="status"></param>
        /// <returns></returns>
        internal virtual ConfigUnit OnUpdate(object status)
        {
            lock (this)
            {
                try
                {
                    string filePath = this.ConfigFileFullPath;//System.IO.Path.Combine(Convert.ToString(status), FilePath);
                    ConfigUnit conf = SerializationHelper.Load(this.GetType(), filePath) as ConfigUnit;
                    //更新最后一次加载时间为当前时间
                    conf.LastLoadTime = DateTime.Now;
                    return conf;
                }
                catch (Exception ex)
                {
                    throw new Exception(string.Format(this.GetType().ToString() + "文件序列化错误，错误信息：{0}", ex.Message));
                }
            }
        }

        /// <summary>
        /// 配置文件的全路径；
        /// </summary>
        [System.Xml.Serialization.XmlIgnore]
        [ConfigAccess(ConfigAccessAttribute.ALL)]
        public string ConfigFileFullPath
        {
            get
            {
                //return Path.Combine(Config.Path, FilePath);

                //第一次没有找到文件，马上再找一次，如果还是没有找到，说明没有对应的配置文件，记录日志；
                if (!Config.ConfigFileFullPathDic.ContainsKey(FilePath.ToLower()))
                {
                    Config.ConfigFileFullPathDic = null;
                }
                if (!Config.ConfigFileFullPathDic.ContainsKey(FilePath.ToLower()))
                {
                    //ConfigLogHelper.ConfigLog(string.Format("'{0}'下（包括子文件夹）不存在'{1}'", Config.Path, FilePath), ConfigLogLevelEnum.Error);
                    throw new Exception(string.Format("'{0}'下（包括子文件夹）不存在'{1}'", Config.Path, FilePath));
                }
                else
                {
                    return Config.ConfigFileFullPathDic[FilePath.ToLower()];
                }
            }
        }

    }
}
